package com.cty.servlet;

import com.cty.pojo.User;
import com.cty.service.UserService;
import com.cty.service.impl.UserServiceImpl;
import org.apache.log4j.Logger;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @Auther: cty
 * @Date: 2020/2/21 21:37
 * @Description:
 * @version: 1.0
 */
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
    static Logger logger = Logger.getLogger(UserServlet.class);
    UserService us = new UserServiceImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求编码格式
        req.setCharacterEncoding("utf-8");
        // 设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        // 获取请求服务数据
        String oper = req.getParameter("oper");
        // 处理请求服务数据
        if("login".equals(oper)){
            // 调用登录处理方法
            checkUserLogin(req, resp);
        }else if("out".equals(oper)){
            // 调用退出处理方法
            userOut(req, resp);
        }else if("pwd".equals(oper)){
            // 调用修改密码方法
            userChangePwd(req, resp);
        }else if("show".equals(oper)){
            // 调用显示所有用户信息方法
            userShow(req, resp);
        }else if("reg".equals(oper)){
            // 调用注册处理方法
            userReg(req, resp);
        }else {
            logger.debug("没找到相应的操作符："+oper);
        }
    }

    /**
     * 用户注册方法
     * @param req
     * @param resp
     */
    private void userReg(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 获取用户注册数据
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        int sex = Integer.parseInt(req.getParameter("sex"));
        int age = req.getParameter("age")!=""?Integer.parseInt(req.getParameter("age")):0;
        String birth = req.getParameter("birth");
        // 将birth转化为数据库识别的日期格式
        DateFormat dfStr2Date = new SimpleDateFormat("MM/dd/yyyy");
        Date date = null;
        try {
            date = dfStr2Date.parse(birth);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        DateFormat dfDate2Str = new SimpleDateFormat("yyyy-MM-dd");
        birth = dfDate2Str.format(date);
        // 将用户注册信息存入request作用域
        User user = new User(0, uname, pwd, sex, age, birth);
//        logger.debug("注册用户："+user);
        req.setAttribute("user", user);
        // 调用服务层方法，将注册信息存入数据库
        int index = us.userRegService(req, resp);
        if(index > 0){
            // 获取和设置session对象
            HttpSession hs = req.getSession();
            hs.setAttribute("flag", 2);
            // 重定向
            resp.sendRedirect("/manager/login.jsp");
        }
    }

    /**
     * 显示所有用户信息方法
     * @param req
     * @param resp
     */
    private void userShow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 调用获取所有用户信息服务
        List<User> lu = us.userShowService();
        // 判断
        if(null != lu){
            // 将获取的数据存入request作用域
            req.setAttribute("lu", lu);
            // 请求转发到信息显示页面
            // 注意：若使用重定向，则用session存储读取数据，可能会出现脏读问题
            req.getRequestDispatcher("/user/userShow.jsp").forward(req, resp);
        }
    }

    /**
     * 修改密码方法
     * @param req
     * @param resp
     * @throws IOException
     */
    private void userChangePwd(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 获取密码数据
        String newPwd = req.getParameter("newPwd");
        // 从session中获取用户ID和name
        User user = (User)req.getSession().getAttribute("user");
        int uid = user.getUid();
        String uname = user.getUname();
        // 调用修改密码服务
        int index = us.pwdChangeService(uid, uname, newPwd);
        if(index > 0){
            // 获取和设置session对象
            HttpSession hs = req.getSession();
            hs.setAttribute("flag", 1);
            // 重定向
            resp.sendRedirect("/manager/login.jsp");
        }
    }

    /**
     * 退出登录方法
     * @param req
     * @param resp
     * @throws IOException
     */
    private void userOut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 获取session对象
        HttpSession hs = req.getSession();
        User user = (User)hs.getAttribute("user");
        if(null!=user){
            logger.debug("用户"+user.getUname()+"退出");
        }else{
            logger.debug("用户已超时退出");
        }

        // 强制销毁session对象
        hs.invalidate();
        // 重定向到登录界面
        resp.sendRedirect("/manager/login.jsp");
//        resp.getWriter().write("退出登录！");
    }

    // 登录方法
    private void checkUserLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        // 获取用户请求参数
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
//        logger.debug("用户请求数据 uname: "+uname+"  pwd: "+pwd);

        // 调用服务层方法进行校验
        User user = us.checkUserLoginService(uname, pwd);
//        logger.info("从服务层获取数据库校验对象："+user);

        // 校验结果分析
        if(null!=user){
            // 获取session对象
            HttpSession hs = req.getSession();
            // 将用户数据存到session
            hs.setAttribute("user", user);
            // 重定向
            resp.sendRedirect("/manager/main/main.jsp");
        } else{
            // 添加标识符到request中
            req.setAttribute("flag",0);
            // 请求转发
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }
}
